package utils;

import java.io.File;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.IOException;
import java.util.ArrayList;
import java.util.List;

public class FileUtil {
    /**
     * @return void 返回类型
     * @Title: getallfile
     * @Description: 获取当前路径下的所有文件
     * @author ruby
     * @date 2018年1月4日 下午2:15:38 @throws
     */
    public static List<File> getallfile(String path) {
        List<File> allfilelist = new ArrayList<File>();
        return getallfile(new File(path), allfilelist);
    }

    /**
     * @return void 返回类型
     * @Title: getallfile
     * @Description: 获取当前文件夹下的所有文件
     * @author ruby
     * @date 2018年1月4日 下午2:15:38 @throws
     */
    public static List<File> getallfile(File file, List<File> allfilelist) {
        if (file.exists()) {
            //判断文件是否是文件夹，如果是，开始递归
            if (file.isDirectory()) {
                File f[] = file.listFiles();
                sortFileName(f);
                for (File file2 : f) {
                    getallfile(file2, allfilelist);
                }
            } else {
                allfilelist.add(file);
            }
        }
        return allfilelist;
    }

    //第一种排序方法  比较文件名 自然排序 按照文件名字符的ASCII码表值进行排序
    public static void sortFileName(File[] ll) {
//for循环遍历数组ll中所有元素进行排序
        for (int i = 0; i < ll.length; i++) {
            for (int j = i + 1; j < ll.length; j++) {
//利用comparTo()方法进行比较 返回值int型 有正数 负数 正数表示前者的ASCII值较大 0表示相等，负数表示前者的ASCII值小
                if (ll[i].compareTo(ll[j]) > 0) {
//交换赋值
                    File fe;
                    fe = ll[i];
                    ll[i] = ll[j];
                    ll[j] = fe;
                }
            }
//            System.out.println(ll[i]);
        }
    }

    //第二中排序方法 按照文件大小排序
    public static void sortFileSize(File[] ll) {
//for循环遍历数组ll中所有元素进行排序
        for (int i = 0; i < ll.length; i++) {
            for (int j = i + 1; j < ll.length; j++) {
//length()方法 返回文件的长度 也就是文件的大小  返回值是long型
                if (ll[i].length() < ll[j].length()) {
//交换赋值
                    File fe;
                    fe = ll[i];
                    ll[i] = ll[j];
                    ll[j] = fe;
                }
            }
            System.out.println(ll[i]);
        }
    }

    //第三种排序方法 按最后一次修改的时间
    public static void sortFileUpdateTime(File[] ll) {
//for循环遍历数组ll中所有元素进行排序
        for (int i = 0; i < ll.length; i++) {
            for (int j = i + 1; j < ll.length; j++) {
//lastModified()方法返回文件最后一次被修改的时间 毫秒 返回值是long型
                if (ll[i].lastModified() < ll[j].lastModified()) {
//交换赋值
                    File fe;
                    fe = ll[i];
                    ll[i] = ll[j];
                    ll[j] = fe;
                }
            }
            System.out.println(ll[i]);
        }
    }


    /**
     * @Author GongXl
     * @Description 文件复制
     * @Date 024 15:07
     * @Param [sourceFile, destDir]
     * @return void
     **/
    public static void copyFile(File sourceFile,File destDir){
        FileInputStream fis = null;
        FileOutputStream fos = null;
        try {
            fis = new FileInputStream(sourceFile);
            File destFile = new File(destDir + File.separator +  sourceFile.getName());
            if(!destDir.exists()){
                destDir.mkdirs();//创建目录
            }
            if(!destFile.exists()){
                destFile.createNewFile();//创建文件
            }
            fos = new FileOutputStream(destDir + File.separator +  sourceFile.getName());
            byte[] buffer = new byte[1024];
            while (fis.read(buffer) != -1){
                fos.write(buffer);
                fos.flush();
            }
        } catch (IOException e) {
            e.printStackTrace();
        }finally {
            if(null != fos){
                try {
                    fos.close();
                } catch (IOException e) {
                    e.printStackTrace();
                }
            }
            if(null != fis){
                try {
                    fis.close();
                } catch (IOException e) {
                    e.printStackTrace();
                }
            }
        }
    }
    /**
     * @Author GongXl
     * @Description 文件复制功能
     * @Date 024 15:05
     * @Param [sourceFile, destDir]
     * @return void
     **/
    public static void copyFile(String sourceFile,String destDir){
        File file = new File(sourceFile);//源文件
        File parentD = new File(destDir);
        copyFile(file,parentD);
    }
    /**
     * @Author GongXl
     * @Description 复制目录
     * @Date 024 16:43
     * @Param [sourceDir--原目录, destDir--目标目录]
     * @return void
    **/
    public static  void copyDir(String sourceDir,String destDir){
        List<File> fileList = new ArrayList();
        getallfile(new File(sourceDir),fileList);
        for (int i = 0; i < fileList.size(); i++) {
            File tempFile = fileList.get(i);
            copyFile(tempFile.getAbsolutePath(),destDir + File.separator + tempFile.getParent());//将文件复制到指定目录
        }
    }

}
